寫在前面
這個章節也是篇幅很多, 慢慢寫囉
出處 , 有繁體中文版, 有些部分簡體中文版也翻得很好
Using a Database (with Mongoose)
Overview
Express 可以使用的資料庫有很多, 同時也有許多方法可以達成 CRUD 。
What databases can I use?
Node 有支援的 db 都可以用。 包括 PostgreSQL, MySQL, Redis, SQLite, MongoDB
選擇 db ,需要考慮到學習曲線、 產出效率、 備份難易度、 成本、 社群支持 ... 等等。 點擊 Database integration ( Express docs ) 看更多
What is the best way to interact with a database?
跟 db 互動方式有二:
- 用 db 原生 query 語言, 例如 SQL
- 用 Obj Data / Relational Model ( ODM / ORM ) , 會把資料表現得像是 JS obj 一樣, 對我們來說比較好理解。 ( 第九天有聊過這個,略過 )
使用原生會有超好的效率, ODM 因為還要轉譯所以會慢些, 最大好處一樣是上面說的容易理解、 不用再花時間學 query 語言
Tip: ODM/ORM 通常會有較低的開發及維護成本, 除非我們本身就非常熟悉 query 語言或者超級要求性能。 ( 基本上就是在講同一件事啦 )
What ODM/ORM should I use?
NPM 有很多可以用的 ODM/ORM 方式:
- Mongoose: MongoDB obj modeling tool , 設計用來處理非同步環境
- Waterline: 從 Sails ( 一個以 Express 為基底的框架 ) 取出的 ORM , 它提供統一的 API 存取眾多不同的 db , 包含 Redis, MySQL, LDAP, MongoDB, Postgres
- Bookshelf: 以兼具 promise-based & 傳統 callback 介面為特色, 支援一對一、 一對多、 多對多關係, 用於 PostgreSQL, MySQL, SQLite3
- Objection: 讓 SQL 發揮更強大的威力不再是難事, 支援同上
- Sequelize: Node.js & io.js 的 promise-based ORM , 支援 PostgreSQL, MySQL, MariaDB, SQLite, MSSQL
- Node ORM2: 用 oo 方式處理 db 有關的任務, 支援 MySQL, SQLite, Progress
- JugglingDB: Node 的 cross-DB ORM, 支援 PostgreSQL, MySQL, SQLite3, MongoDB, Redis, js-memory-storage
選擇時, 除了提供的特色外, 一樣要看社群活躍程度。 這篇文章 ( MDN原文 ) 撰寫時, Mongoose 還是最熱門的 ODM 。
Using Mongoose and MongoDb for the LocalLibrary
在這個圖書館網站範例中, 我們使用 Mongoose 作為前端與 MongoDB 溝通的行為, MongoDB 是一個 NoSQL db, 有 document-oriented (中譯:文件導向,相關中文資料貌似不多,附上 wiki 連結, 是 NoSQL 資料庫的主要類別之一) 特性。 collection of documents 轉化為 table of rows ( 第九天的文章也有相關連結可參考 )
Tip: 要使用 Mongoose , 不知道 MongoDB 也無妨。 如果已經熟悉 MongoDB, 可以看 Mongoose documentation 可以更快了解
接下來會為圖書館網站定義及存取 Mongoose schema & models